"""
与用户账号信息处理相关的视图类或视图函数的声明
"""
from django.http import JsonResponse

from meiduo_move_server import project_constants as p_const
from user.utils import jwt_utils
from meiduo_move_server.utils.mysql_utils import MySQLUtils
from meiduo_move_server.utils import request_utils


def isUserLogin(token):
    """
    判断用户是否处于登录状态

    @param - token: 用户登录令牌

    @return: 如果用户处于登录状态返回None，否则返回未登录的Json响应对象
    """
    if token is None:  # token不存在，未登录
        return JsonResponse({
            'mark': p_const.MARK_ERROR,
            'message': '用户未登录'
        })
    token_data = jwt_utils.get_payload(token)  # 获取token中的数据信息
    if token_data is None:  # 返回为空，未登录或登录令牌过期
        return JsonResponse({
            'mark': p_const.MARK_ERROR,
            'message': '用户未登录'
        })
    return None


def selectUsername_UserAccount(req):
    """
    根据当前登录账号的token查询当前账号的用户名和用户账号

    @param - req: 请求信息对象

    @return: 响应对象
    """
    token = req.GET.get('token')  # 获取token
    res = isUserLogin(token)  # 判断用户是否登录了
    if res is not None:
        return res
    token_data = jwt_utils.get_payload(token)  # 获取token中的数据信息
    userAccount = token_data.get('userAccount')  # 获取当前登录用户的用户账号或手机号
    # 查询用户账号与用户名以及用户头像地址
    sql = """
    SELECT user_account, username, user_head_picture FROM v_user_account_info_user
    WHERE user_account = %s OR user_telephone = %s;
    """
    res_data = MySQLUtils.select(sql, (userAccount, userAccount))
    # print(res_data)
    return JsonResponse({
        'mark': p_const.MARK_SUCCESS,
        'message': '获取用户名与用户账号成功',
        'data': {
            'username': res_data.get('data')[0][1],
            'userAccount': res_data.get('data')[0][0],
            'userHeadPicture': res_data.get('data')[0][2],
        }
    })


def selectUserInfo(req):
    """
    根据当前登录账号的用户账号或手机号查询用户的个人信息，
    查询出来的用户信息包含用户账号，用户名，姓名，性别，身份证号，手机号，邮箱，以及用户头像路径

    @param - req: 请求信息对象

    @return: 响应对象
    """
    token = req.GET.get('token')  # 获取token
    res = isUserLogin(token)  # 判断用户是否登录了
    if res is not None:  # 未登录
        return res
    token_data = jwt_utils.get_payload(token)  # 获取token中的数据信息
    userAccount = token_data.get('userAccount')  # 获取当前登录用户的用户账号或手机号
    sql = """
    SELECT *
    FROM v_user_account_info_user_personal_info
    WHERE user_account = %s OR user_telephone = %s;
    """
    res_data = MySQLUtils.select(sql, (userAccount, userAccount))
    # print(res_data)
    return JsonResponse({
        'mark': p_const.MARK_SUCCESS,
        'message': '获取用户名与用户账号成功',
        'data': {
            'userHeadPicture': res_data.get('data')[0][0],
            'userAccount': res_data.get('data')[0][1],
            'username': res_data.get('data')[0][2],
            'userRealName': res_data.get('data')[0][3],
            'userGender': res_data.get('data')[0][4],
            'userIdCardNumber': res_data.get('data')[0][5],
            'userTelephone': res_data.get('data')[0][6],
            'userEmail': res_data.get('data')[0][7],
        }
    })


def changeUserInfo(req):
    """
    根据post请求中传递过来的token中的用户账号或手机号和当前要修改的项及其值对用户的信息进行相应的修改

    @param - req: 请求信息对象

    @return: 响应对象
    """
    body = request_utils.getPostDataToDict(req.body)  # 获取post请求中传递的数据
    token = body.get('token')  # 获取token
    res = isUserLogin(token)  # 判断用户是否登录了
    if res is not None:  # 未登录
        return res
    token_data = jwt_utils.get_payload(token)  # 获取token中的数据信息
    userAccount = token_data.get('userAccount')  # 获取当前登录用户的用户账号或手机号
    field_name = body.get('field_name')  # 获取要进行修改信息的信息项
    param = body.get('param')  # 修改信息项修改后的值
    sql = """
    CALL p_update_user_info(%s, %s, %s);
    """
    print(userAccount, field_name, param)
    row_count = MySQLUtils.update(sql, (userAccount, field_name, param))
    if row_count < 1:
        return ({
            'mark': p_const.MARK_ERROR,
            'message': '信息修改失败'
        })
    return JsonResponse({
        'mark': p_const.MARK_SUCCESS,
        'message': '信息修改成功'
    })


def changePassword(req):
    """
    修改用户账号密码
    """
    body = request_utils.getPostDataToDict(req.body)
    token = body.get('token')
    userId = jwt_utils.get_payload(token).get('userId')
    oldPassword = body.get('oldPassword')
    sql = """
    SELECT user_password FROM user_account_info WHERE id = %s AND user_password = %s;
    """
    res_data = MySQLUtils.select(sql, (userId, oldPassword))
    if res_data.get('row_count') < 1:
        return JsonResponse({
            'mark': p_const.MARK_ERROR,
            'message': '原密码输入错误'
        })
    sql = """
        UPDATE user_account_info SET user_password = %s WHERE id = %s;
        """
    newPassword = body.get('newPassword')
    row_count = MySQLUtils.update(sql, (newPassword, userId))
    if row_count < 1:
        return JsonResponse({
            'mark': p_const.MARK_ERROR,
            'message': '密码修改失败'
        })
    return JsonResponse({
        'mark': p_const.MARK_SUCCESS,
        'message': '密码修改成功'
    })